﻿using DataObjects;
using InfrastructureSqlServer.Helpers;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace DataAccess
{
    public class PessoaDAO
    {
        private List<Pessoa> CarregarListaPessoa(SqlDataReader dr)
        {
            List<Pessoa> liPessoa = new List<Pessoa>();

            while (dr.Read())
            {
                Pessoa pessoa = new Pessoa();
                pessoa.PessoaId = int.Parse(dr["PESSOAID"].ToString());
                pessoa.Nome = dr["NOME"].ToString();
                pessoa.Telefone = dr["TELEFONE"].ToString();
                pessoa.Cpf = dr["CPF"].ToString();
                pessoa.Email = dr["EMAIL"].ToString();
                pessoa.Observacao = dr["OBSERVACAO"].ToString();
                SaldoClienteDAO _saldoClienteDAO = new SaldoClienteDAO();
                List<SaldoCliente> _saldoCliente = _saldoClienteDAO.Consultar(pessoa.PessoaId);
                if (_saldoCliente != null && _saldoCliente.Count != 0)
                    pessoa.SaldoCliente = _saldoCliente[0];
                liPessoa.Add(pessoa);
            }

            return liPessoa;
        }

        public void Inserir(Pessoa _pessoa)
        {
            SqlParameter[] paramsToSP = new SqlParameter[5];

            paramsToSP[0] = new SqlParameter("@nome", _pessoa.Nome);
            paramsToSP[1] = new SqlParameter("@telefone", _pessoa.Telefone);
            paramsToSP[2] = new SqlParameter("@cpf", _pessoa.Cpf);
            paramsToSP[3] = new SqlParameter("@email", _pessoa.Email);
            paramsToSP[4] = new SqlParameter("@observacao", _pessoa.Observacao);

            try
            {
                SqlHelper.ExecuteScalar(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.StoredProcedure, "stp_insert_pessoa", paramsToSP);

            }
            catch (Exception e)
            {
                throw new Exception("Erro ao inserir pessoa, Erro: " + e.Message);
            }

        }

        public bool Alterar(Pessoa _pessoa)
        {
            SqlParameter[] paramsToSP = new SqlParameter[6];

            paramsToSP[0] = new SqlParameter("@pessoaId", _pessoa.PessoaId);
            paramsToSP[1] = new SqlParameter("@nome", _pessoa.Nome);
            paramsToSP[2] = new SqlParameter("@telefone", _pessoa.Telefone);
            paramsToSP[3] = new SqlParameter("@cpf", _pessoa.Cpf);
            paramsToSP[4] = new SqlParameter("@email", _pessoa.Email);
            paramsToSP[5] = new SqlParameter("@observacao", _pessoa.Observacao);

            try
            {
                SqlHelper.ExecuteNonQuery(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.StoredProcedure, "stp_update_pessoa", paramsToSP);
                return true;
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao alterar pessoa, Erro: " + e.Message);
            }

        }

        public bool Deletar(int _pessoaId)
        {
            SqlParameter[] paramsToSP = new SqlParameter[1];

            paramsToSP[0] = new SqlParameter("@pessoaId", _pessoaId);

            try
            {
                SqlHelper.ExecuteNonQuery(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.StoredProcedure, "stp_delete_pessoa", paramsToSP);
                return true;
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao deletar pessoa, Erro: " + e.Message);
            }

        }

        public List<Pessoa> Consultar(int _pessoa)
        {
            string sqlQuery = string.Format("SELECT * FROM PESSOA WHERE PESSOAID = {0}", _pessoa);

            try
            {
                return CarregarListaPessoa(SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.Text, sqlQuery));
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao consultar pessoa, Erro: " + e.Message);
            }

        }

        public List<Pessoa> Consultar(string _nome)
        {
            string sqlQuery = string.Format("SELECT * FROM PESSOA WHERE nome like '%{0}%'", _nome);

            try
            {
                return CarregarListaPessoa(SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.Text, sqlQuery));
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao consultar pessoa, Erro: " + e.Message);
            }

        }

        public List<Pessoa> Consultar()
        {
            string sqlQuery = string.Format("SELECT * FROM PESSOA ");

            try
            {
                return CarregarListaPessoa(SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.Text, sqlQuery));
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao consultar pessoa, Erro: " + e.Message);
            }

        }

    }//class
}//namespace
